package com.enqualcomm.kids.manager;

import com.enqualcomm.kids.network.socket.response.AllTerminalConfig;
import com.enqualcomm.kids.network.socket.response.TerminalConfigResult;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 * Created by Yinzhiqun on 2016/6/30.
 */
public class Controller {
    private static final int ENABLE = 1;
    private static final Controller INSTANCE = new Controller();

    public static Controller getInstance() {
        return INSTANCE;
    }

    /**
     * 服务器给的参数
     */
    private volatile boolean 是否老人手表;
    private volatile boolean child_product_enable = true;
    private volatile boolean 是否宠物定位器;
    private volatile boolean student_product_enable;
    private volatile boolean 是否支持一卡双号;
    private volatile boolean 是否支持计步;
    private volatile boolean 是否支持天气;
    private volatile boolean 是否支持艾知识;
    private volatile boolean 是否支持看世界;
    private volatile boolean 是否支持亲友圈;
    private volatile boolean 是否支持电子围栏;
    private volatile boolean 是否支持查话费;
    private volatile boolean 是否支持行为模式;
    private volatile boolean 是否支持线路规划;
    private volatile boolean 是否支持打电话;
    private volatile boolean 是否支持监护;
    private volatile boolean 是否支持拍照;
    private volatile boolean 是否支持微话;
    private volatile boolean 是否支持语音提醒;
    private volatile boolean 是否支持寻机;
    private volatile boolean 是否支持定位模式;
    private volatile boolean 是否支持调节音量;
    private volatile boolean 是否支持闹钟;
    private volatile boolean 是否支持设置手表时间;
    private volatile boolean 是否支持轨迹播放;
    private volatile boolean 是否支持定位;
    private volatile boolean 是否支持远程关机;
    private volatile boolean 是否开启 = false;

    /**
     * 手表上传的参数
     */
    private volatile boolean 手表_是否老人手表;
    private volatile boolean 手表_child_product_enable = true;
    private volatile boolean 手表_是否宠物定位器;
    private volatile boolean 手表_student_product_enable;
    private volatile boolean 手表_是否支持一卡双号 = true;
    private volatile boolean 手表_是否支持计步;
    private volatile boolean 手表_是否支持天气 = true;
    private volatile boolean 手表_是否支持艾知识;
    private volatile boolean 手表_是否支持看世界 = true;
    private volatile boolean 手表_是否支持亲友圈;
    private volatile boolean 手表_是否支持电子围栏;
    private volatile boolean 手表_是否支持查话费;
    private volatile boolean 手表_是否支持行为模式;
    private volatile boolean 手表_是否支持线路规划 = true;
    private volatile boolean 手表_是否支持打电话;
    private volatile boolean 手表_是否支持监护;
    private volatile boolean 手表_是否支持拍照 = true;
    private volatile boolean 手表_是否支持微话;
    private volatile boolean 手表_是否支持语音提醒;
    private volatile boolean 手表_是否支持寻机;
    private volatile boolean 手表_是否支持定位模式 = true;
    private volatile boolean 手表_是否支持调节音量;
    private volatile boolean 手表_是否支持闹钟;
    private volatile boolean 手表_是否支持设置手表时间;
    private volatile boolean 手表_是否支持轨迹播放 = true;
    private volatile boolean 手表_是否支持定位 = true;
    private volatile boolean 手表_是否支持远程关机;
    private volatile boolean 手表_是否奥狮卡;


    public void reset(AllTerminalConfig.Config config) {
        是否支持计步 = config.pedometer == ENABLE;
        是否老人手表 = config.old_product == ENABLE;
        是否支持电子围栏 = config.fence == ENABLE;
        是否支持亲友圈 = config.relative == ENABLE;
        是否支持查话费 = config.check_bill == ENABLE;
        是否支持监护 = config.monitor == ENABLE;
        是否支持寻机 = config.search_terminal == ENABLE;
        是否支持定位模式 = config.work_mode == ENABLE;
        是否支持调节音量 = config.volume == ENABLE;
        是否支持闹钟 = config.alarm == ENABLE;
        是否支持设置手表时间 = config.time_set == ENABLE;
        是否宠物定位器 = config.pet_product == ENABLE;

        是否支持语音提醒 = config.voice_notice == ENABLE;
        是否支持艾知识 = config.q_a == ENABLE;
        是否支持看世界 = config.find == ENABLE;
        是否支持拍照 = config.camera == ENABLE;
        是否支持线路规划 = config.routeplanning == ENABLE;
        是否支持行为模式 = config.behavior_mode == ENABLE;
        是否支持一卡双号 = config.simtype == ENABLE;
        是否支持远程关机 = config.reset == ENABLE;
        是否支持天气 = config.weather == ENABLE;
        是否支持微话 = config.wechat == ENABLE;
        是否支持打电话 = config.make_call == ENABLE;
        是否支持定位 = config.localtion == ENABLE;
        是否支持轨迹播放 = config.tracker == ENABLE;
        是否开启 = config.is_open == ENABLE;
    }

    public void resetTerminalConfig(TerminalConfigResult.Data config) {
        if (config != null){
            手表_是否老人手表 = (config.imei.length() == 16 && config.imei.endsWith("1"));//根据cid判断老年模式、宠物、儿童
            手表_是否宠物定位器 = (config.imei.length() == 16 && config.imei.endsWith("a"));

            手表_是否支持定位模式 = true;
            手表_是否支持看世界 = true;
            手表_是否支持拍照 = true;
            手表_是否支持线路规划 = true;
            手表_是否支持一卡双号 = true;
            手表_是否支持天气 = true;
            手表_是否支持定位 = true;
            手表_是否支持轨迹播放 = true;

            手表_是否支持电子围栏 = config.gps == ENABLE;
//        手表_是否支持电子围栏 = true;

            手表_是否支持亲友圈 = config.relatives == ENABLE;
            手表_是否支持远程关机 = config.reboot == ENABLE;

            手表_是否支持计步 = config.pedometer == ENABLE;
            手表_是否支持查话费 = config.check_bill == ENABLE;
            手表_是否支持监护 = config.monitor == ENABLE;
            手表_是否支持寻机 = config.search_terminal == ENABLE;
            手表_是否支持调节音量 = config.volume == ENABLE;
            手表_是否支持闹钟 = config.alarm == ENABLE;
//        手表_是否支持闹钟 = true;

            手表_是否支持设置手表时间 = config.time_set == ENABLE;
            手表_是否支持语音提醒 = config.voice_notice == ENABLE;
//        手表_是否支持语音提醒 = true;

            手表_是否支持艾知识 = (config.q_a == ENABLE || config.q_a == 2); //热艾服务器给数值是2
            手表_是否支持行为模式 = config.behavior_mode == ENABLE;
            手表_是否支持微话 = config.wechat == ENABLE;
            手表_是否支持打电话 = config.make_call == ENABLE;
            手表_是否奥狮卡 = config.url_download ==ENABLE;
//        手表_是否奥狮卡 = true;
        }else {
            手表_是否支持艾知识 = false; //热艾服务器给数值是2
            手表_是否奥狮卡 = false;
        }


    }

    public void setCidMode(String cid) {
        手表_是否老人手表 = (cid.length() == 16 && cid.endsWith("1"));//根据cid判断老年模式、宠物、儿童
        手表_是否宠物定位器 = (cid.length() == 16 && cid.endsWith("a"));
    }

    public void setGps(int gps) {
        手表_是否支持电子围栏 = gps == ENABLE;
    }

    public void setRelatives(int relatives) {
        手表_是否支持亲友圈 = relatives == ENABLE;
    }

    public boolean isOldMainMode() {
        return 是否开启 ? 是否老人手表 : 手表_是否老人手表;
    }

    public boolean isSupportPedometer() {
        return 是否开启 ? 是否支持计步 : 手表_是否支持计步;
    }

    private PedometerHandler 计步控制器;
    private PedometerHandler 计步控制器_实现1;
    private PedometerHandler 计步控制器_实现2;

    private AddTerminalHandler 添加手表控制器;
    private AddTerminalHandler 添加手表控制器_实现1;
    private AddTerminalHandler 添加手表控制器_实现2;
    private AddTerminalHandler 添加手表控制器_实现3;
    private AddTerminalHandler 添加手表控制器_实现4;
    /*语音提醒*/
    private VolumeNoticeHandler volumeNoticeHandler;
    private VolumeNoticeHandler volumeNoticeHandlerVisiable;
    private VolumeNoticeHandler volumeNoticeHandlerInvisiable;

    /**
     * 书页
     */
    private ModeHandler modeHandler;
    private OldManModeHandlerImp1 oldManModeHandlerImp1;
    private ChildModeHandlerImp childModeHandlerImp;
    private PetModeHanlderImp petModeHanlderImp;

    /**
     * 手表的定位模式
     */

    private LocationModeHandler locationModeHandler;
    private LocationModeHandlerImp1 locationModeHandlerImp1;

    public Controller() {
        ClassLoader classLoader = getClass().getClassLoader();
        计步控制器_实现1 = new PedometerHandlerImp1();//显示计步
        计步控制器_实现2 = new PedometerHandlerImp2();//不显示计步
        计步控制器 = (PedometerHandler) Proxy.newProxyInstance(classLoader, PedometerHandlerImp1.class.getInterfaces(), pedoHandler);

        添加手表控制器_实现1 = new AddTerminalHandlerImp1();//添加学校和家
        添加手表控制器_实现2 = new AddTerminalHandlerImp2();//添加家
        添加手表控制器_实现3 = new AddTerminalHandlerImp3();//不添加任何安全区域,设置亲友圈
        添加手表控制器_实现4 = new AddTerminalHandlerImp4();//不添加任何安全区域，不设置亲友圈
        添加手表控制器 = (AddTerminalHandler) Proxy.newProxyInstance(classLoader, AddTerminalHandlerImp1.class.getInterfaces(), addTerminalHandler);

        /**语音提醒*/
        volumeNoticeHandlerVisiable = new VolumeNoticeHandlerImplVisiable();
        volumeNoticeHandlerInvisiable = new VolumeNoticeHandlerImplInVisiable();
        volumeNoticeHandler = (VolumeNoticeHandler) Proxy.newProxyInstance(getClass().getClassLoader(), VolumeNoticeHandlerImplVisiable.class.getInterfaces(), vNoticeHandler);

        /**主页书页显示*/
        oldManModeHandlerImp1 = new OldManModeHandlerImp1();
        childModeHandlerImp = new ChildModeHandlerImp();
        petModeHanlderImp = new PetModeHanlderImp();
        modeHandler = (ModeHandler) Proxy.newProxyInstance(getClass().getClassLoader(), OldManModeHandlerImp1.class.getInterfaces(), iModeHandler);

        /**手表定位模式*/
        locationModeHandlerImp1 = new LocationModeHandlerImp1();
        locationModeHandler = (LocationModeHandler) Proxy.newProxyInstance(getClass().getClassLoader(), LocationModeHandlerImp1.class.getInterfaces(), locModeHandler);
    }

    public PedometerHandler getPedometerHandler() {
        return 计步控制器;
    }

    public ModeHandler getModeHandler() {
        return modeHandler;
    }

    public LocationModeHandler getLocationModeHandler() {
        return locationModeHandler;
    }

    private InvocationHandler pedoHandler = new InvocationHandler() {
        @Override
        public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
            if (是否开启 ? 是否支持计步 : 手表_是否支持计步) {
                return method.invoke(计步控制器_实现1, args);
            } else {
                return method.invoke(计步控制器_实现2, args);
            }
        }
    };

    public AddTerminalHandler getAddTerminalHandler() {
        return 添加手表控制器;
    }

    public VolumeNoticeHandler getVolumeNoticeHandler() {
        return volumeNoticeHandler;
    }

    private InvocationHandler addTerminalHandler = new InvocationHandler() {
        @Override
        public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
            if (!"115.28.144.79".equals(com.android.volley.BuildConfig.IP)) { //热艾服务器不用gps字段
                if (是否开启 ? 是否支持电子围栏 : 手表_是否支持电子围栏) {
                    if (手表_是否老人手表 || 手表_是否宠物定位器) {
                        return method.invoke(添加手表控制器_实现2, args);
                    } else {
                        return method.invoke(添加手表控制器_实现1, args);
                    }
                } else {
                    if (是否开启 ? 是否支持亲友圈 : 手表_是否支持亲友圈) {
                        return method.invoke(添加手表控制器_实现3, args);
                    } else {
                        return method.invoke(添加手表控制器_实现4, args);
                    }
                }
            } else {
                return method.invoke(添加手表控制器_实现1, args);
            }
        }
    };
    private InvocationHandler vNoticeHandler = new InvocationHandler() {
        @Override
        public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
            if (是否开启 ? 是否支持语音提醒 : 手表_是否支持语音提醒) {
                return method.invoke(volumeNoticeHandlerVisiable, args);
            } else {
                return method.invoke(volumeNoticeHandlerInvisiable, args);
            }
        }
    };


    private InvocationHandler iModeHandler = new InvocationHandler() {
        @Override
        public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
            if (是否开启 ? 是否老人手表 : 手表_是否老人手表) {
                return method.invoke(oldManModeHandlerImp1, args);
            } else if (是否开启 ? 是否宠物定位器 : 手表_是否宠物定位器) {
                return method.invoke(petModeHanlderImp, args);
            } else {
                return method.invoke(childModeHandlerImp, args);
            }
        }
    };

    private InvocationHandler locModeHandler = new InvocationHandler() {
        @Override
        public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
            return method.invoke(locationModeHandlerImp1, args);
        }
    };

    public boolean isPet_product_enable() {
        return 是否开启 ? 是否宠物定位器 : 手表_是否宠物定位器;
    }

    public boolean isQ_a_enable() {
        return 是否开启 ? 是否支持艾知识 : 手表_是否支持艾知识;
    }

    public boolean isBehavior_mode_enable() {
        return 是否开启 ? 是否支持行为模式 : 手表_是否支持行为模式;
    }

    public boolean isCheck_bill_enable() {
        return 是否开启 ? 是否支持查话费 : 手表_是否支持查话费;
    }

    public boolean isMonitor_enable() {
        return 是否开启 ? 是否支持监护 : 手表_是否支持监护;
    }

    public boolean isCamera_enable() {
        return 是否开启 ? 是否支持拍照 : 手表_是否支持拍照;
    }

    public boolean isWechat_enable() {
        return 是否开启 ? 是否支持微话 : 手表_是否支持微话;
    }

    public boolean isVoice_notice_enable() {
        return 是否开启 ? 是否支持语音提醒 : 手表_是否支持语音提醒;
    }

    public boolean isSearch_terminal_enable() {
        return 是否开启 ? 是否支持寻机 : 手表_是否支持寻机;
    }

    public boolean isWork_mode_enable() {
        return 是否开启 ? 是否支持定位模式 : 手表_是否支持定位模式;
    }

    public boolean isVolume_enable() {
        return 是否开启 ? 是否支持调节音量 : 手表_是否支持调节音量;
    }

    public boolean isAlarm_enable() {
        return 是否开启 ? 是否支持闹钟 : 手表_是否支持闹钟;
    }

    public boolean isTime_set_enable() {
        return 是否开启 ? 是否支持设置手表时间 : 手表_是否支持设置手表时间;
    }

    public boolean isTracker_enable() {
        return 是否开启 ? 是否支持轨迹播放 : 手表_是否支持轨迹播放;
    }

    public boolean isLocation_enable() {
        return 是否开启 ? 是否支持定位 : 手表_是否支持定位;
    }

    public boolean isweather_enable() {
        return 是否开启 ? 是否支持天气 : 手表_是否支持天气;
    }

    public boolean isfence_enable() {
        return 是否开启 ? 是否支持电子围栏 : 手表_是否支持电子围栏;
    }

    public boolean isSIMtype() {
        return 是否开启 ? 是否支持一卡双号 : 手表_是否支持一卡双号;
    }

    public boolean isrouteplanning() {
        return 是否开启 ? 是否支持线路规划 : 手表_是否支持线路规划;
    }

    public boolean isfind() {
        return 是否开启 ? 是否支持看世界 : 手表_是否支持看世界;
    }

    public boolean isshutdown_enable() {
        return 是否开启 ? 是否支持远程关机 : 手表_是否支持远程关机;
    }

    public boolean ismake_call_enable() {
        return 是否开启 ? 是否支持打电话 : 手表_是否支持打电话;
    }

    public boolean isfamily_enable() {
        return 手表_是否支持亲友圈;
    }

    public boolean oscard_enable() {
        return 手表_是否奥狮卡;
    }

}
